home *** CD-ROM | disk | FTP | other *** search
/ SuperView Productivity Suite 2 / SuperView Productivity Suite 2.iso / BONUS / PROGS / StackAid.lha / StackAid / IPrefsSrc / IPrefsPatch.c < prev    next >
C/C++ Source or Header  |  1998-08-01  |  2KB  |  101 lines

  1. ;/* Just execute to compile.
  2.  
  3. sc IPrefsPatch
  4. quit
  5.  
  6. */
  7.  
  8. /*
  9. **      $VER: IPrefsPatch 1.4 (1.8.97)
  10. **
  11. **      Patches the "IPrefs" process to use a bigger stack
  12. **
  13. **      written in 1998 by Andreas R. Kleinert, minor mods by Jim Cooper
  14. **      All Rights Reserved.
  15. */
  16.  
  17. #define __USE_SYSBASE
  18.  
  19. #include <exec/types.h>
  20. #include <exec/memory.h>
  21. #include <exec/tasks.h>
  22.  
  23. #include <proto/exec.h>
  24. #include <proto/dos.h>
  25.  
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <string.h>
  29.  
  30. #ifdef __SASC
  31. static const char ver_text[] = "$VER: IPrefsPatch 1.4 " __AMIGADATE__;
  32. #else
  33. static const char ver_text[] = "$VER: IPrefsPatch 1.4 (1.8.98)";
  34. #endif
  35.  
  36. #define STACKSIZE 8192
  37.  
  38.  /* NOTE: This is NOT a good example for stack swapping,
  39.           since the OLD stack's buffer _NEVER_ will
  40.           be delocated. However, there is no other
  41.           way to achieve a larger stack for IPrefs,
  42.           and since IPrefs usually never will end, this
  43.           perhaps isn't a problem...
  44.  
  45.     DON'T TRY THIS PATCHING SCHEME WITH OTHER TASKS/PROCESSES !
  46.  
  47.  */
  48.  
  49. int IPrefsPatch(void)
  50. {
  51.  struct Task *we;
  52.  UBYTE *msg;
  53.  struct ExecBase *SysBase = *(void **)4;
  54.  struct DosLibrary *DOSBase;
  55.  
  56.  DOSBase = (struct DosLibrary *)OpenLibrary("dos.library", 33);
  57.  
  58.  Forbid();
  59.  
  60.  we = FindTask("« IPrefs »");
  61.  if(we)
  62.   {
  63.    if( (ULONG) we->tc_SPUpper - (ULONG) we->tc_SPLower < STACKSIZE)
  64.     {
  65.      struct Process *we2;
  66.      UBYTE *lower, *upper, *pointer;
  67.      ULONG inuse;
  68.  
  69.      lower   = (UBYTE *) AllocMem(STACKSIZE, MEMF_PUBLIC);
  70.      upper   = (UBYTE *) (STACKSIZE + (UBYTE *) lower);
  71.  
  72.      inuse = (ULONG) we->tc_SPUpper - (ULONG) we->tc_SPReg;
  73.  
  74.      pointer = ((UBYTE *) upper) - inuse;
  75.  
  76.      CopyMem(we->tc_SPReg, pointer, inuse);
  77.  
  78.      we->tc_SPReg   = (APTR) pointer;
  79.      we->tc_SPLower = (APTR) lower;
  80.      we->tc_SPUpper = (APTR) upper;
  81.  
  82.      we2               = (struct Process *) we;
  83.      we2->pr_StackSize = STACKSIZE;
  84.      we2->pr_StackBase = (BPTR) (((ULONG)upper)>>2);
  85.  
  86.          msg = "Patch done!\n";
  87.    }else msg = "Already patched.\n";
  88.   }else  msg = "Wrong WB version.\n";
  89.  
  90.  Permit();
  91.  
  92.  if(IsInteractive(Output()))
  93.   {
  94.    Write(Output(), msg, strlen(msg));
  95.   }
  96.  
  97.  CloseLibrary((struct Library *)DOSBase);
  98.  
  99.  return(0);
  100. }
  101.